package com.sromku.simple.fb.example.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import com.sromku.simple.fb.Permission;
import com.sromku.simple.fb.SimpleFacebook;
import com.sromku.simple.fb.example.Example;
import com.sromku.simple.fb.example.ExamplesAdapter;
import com.sromku.simple.fb.example.R;
import com.sromku.simple.fb.listeners.OnLoginListener;
import com.sromku.simple.fb.listeners.OnLogoutListener;

import java.util.ArrayList;
import java.util.List;

public class MainFragment extends Fragment implements OnItemClickListener {

    protected static final String TAG = MainFragment.class.getName();
    private Button mButtonLogin;
    private Button mButtonLogout;
    private TextView mTextStatus;
    private ListView mListView;

    private ArrayList<Example> mExamples;

    private SimpleFacebook mSimpleFacebook;
    private ExamplesAdapter mExamplesAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSimpleFacebook = SimpleFacebook.getInstance();

        mExamples = new ArrayList<Example>();
        mExamples.add(new Example("Requests", null, false));
        mExamples.add(new Example("Invite", InviteFragment.class, true));
        mExamples.add(new Example("Send message to one", SendMessageToOneFragment.class, true));
        mExamples.add(new Example("Send message to suggested", SendMessageToSuggestedFragment.class, true));
        mExamples.add(new Example("Publish - No Dialog", null, false));
        mExamples.add(new Example("Publish <strong>feed</strong>", PublishFeedFragment.class, true));
        mExamples.add(new Example("Publish <strong>feed</strong> - more options", PublishFeedMoreFragment.class, true));
        mExamples.add(new Example("Publish <strong>story</strong> - url", PublishStoryUrlFragment.class, true));
        mExamples.add(new Example("Publish <strong>story</strong> - id", PublishStoryIdFragment.class, true));
        mExamples.add(new Example("Publish <strong>story</strong> - user-owned", PublishStoryUserOwnedFragment.class, true));
        mExamples.add(new Example("Publish <strong>photo</strong>", PublishPhotoFragment.class, true));
        mExamples.add(new Example("Publish <strong>video</strong>", PublishVideoFragment.class, true));
        mExamples.add(new Example("Publish <strong>score</strong>", PublishScoreFragment.class, true));
        mExamples.add(new Example("Publish <strong>comment - text</strong>", PublishCommentFragment.class, true));
        mExamples.add(new Example("Publish <strong>comment - image</strong>", PublishCommentImageFragment.class, true));
        mExamples.add(new Example("Publish <strong>like</strong>", PublishLikeFragment.class, true));
        mExamples.add(new Example("Publish - With Dialog", null, false));
        mExamples.add(new Example("Publish <strong>feed</strong>", PublishFeedDialogFragment.class, false));
        mExamples.add(new Example("Publish <strong>story</strong> - url", PublishStoryUrlDialogFragment.class, false));
        mExamples.add(new Example("Publish <strong>story</strong> - id", PublishStoryIdDialogFragment.class, false));
        mExamples.add(new Example("Publish <strong>story</strong> - user-owned", PublishStoryUserOwnedDialogFragment.class, false));
        mExamples.add(new Example("Publish <strong>photo</strong>", PublishPhotoDialogFragment.class, false));
        mExamples.add(new Example("Publish multiple <strong>photos</strong>", PublishMultiplePhotosDialogFragment.class, false));
        mExamples.add(new Example("Get", null, false));
        mExamples.add(new Example("Get accounts", GetAccountsFragment.class, true));
        mExamples.add(new Example("Get albums", GetAlbumsFragment.class, true));
        mExamples.add(new Example("Get app requests", GetAppRequestsFragment.class, true));
        mExamples.add(new Example("Get books", GetBooksFragment.class, true));
        mExamples.add(new Example("Get comments", GetCommentsFragment.class, true));
        mExamples.add(new Example("Get events (attending)", GetEventsFragment.class, true));
        mExamples.add(new Example("Get family", GetFamilyFragment.class, true));
        mExamples.add(new Example("Get friends", GetFriendsFragment.class, true));
        mExamples.add(new Example("Get games", GetGamesFragment.class, true));
        mExamples.add(new Example("Get groups", GetGroupsFragment.class, true));
        mExamples.add(new Example("Get likes", GetLikesFragment.class, true));
        mExamples.add(new Example("Get movies", GetMoviesFragment.class, true));
        mExamples.add(new Example("Get music", GetMusicFragment.class, true));
        mExamples.add(new Example("Get notifications", GetNotificationsFragment.class, true));
        mExamples.add(new Example("Get page", GetPageFragment.class, true));
        mExamples.add(new Example("Get pages user like", GetPagesLikesFragment.class, true));
        mExamples.add(new Example("Get photos", GetPhotosFragment.class, true));
        mExamples.add(new Example("Get posts", GetPostsFragment.class, true));
        mExamples.add(new Example("Get profile", GetProfileFragment.class, true));
        mExamples.add(new Example("Get scores", GetScoresFragment.class, true));
        mExamples.add(new Example("Get tagged places", GetTaggedPlacesFragment.class, true));
        mExamples.add(new Example("Get television", GetTelevisionFragment.class, true));
        mExamples.add(new Example("Get videos", GetVideosFragment.class, true));
        mExamples.add(new Example("Open Graph Hosted Objects", null, false));
        mExamples.add(new Example("Create object", CreateStoryObjectFragment.class, true));
        mExamples.add(new Example("Get objects", GetStoryObjectsFragment.class, true));
        mExamples.add(new Example("Permissions", null, false));
        mExamples.add(new Example("Show granted permissions", GrantedPermissionsFragment.class, true));
        mExamples.add(new Example("Request new permissions", RequestPermissionsFragment.class, true));
        mExamples.add(new Example("Misc", null, false));
        mExamples.add(new Example("LikeView button", PublishLikeButtonFragment.class, true));
        mExamples.add(new Example("Connect Smart Device", SmartDeviceFragment.class, true));
    }

    @Override
    public void onResume() {
        super.onResume();
        getActivity().setTitle("Simple Facebook Sample");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        mButtonLogin = (Button) view.findViewById(R.id.button_login);
        mButtonLogout = (Button) view.findViewById(R.id.button_logout);
        mTextStatus = (TextView) view.findViewById(R.id.text_status);
        mListView = (ListView) view.findViewById(R.id.list);

        setLogin();
        setLogout();

        mExamplesAdapter = new ExamplesAdapter(mExamples);
        mListView.setAdapter(mExamplesAdapter);
        mListView.setOnItemClickListener(this);

        setUIState();
        return view;
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Class<? extends Fragment> fragment = mExamples.get(position).getFragment();
        if (fragment != null) {
            addFragment(fragment);
        }
    }

    private void addFragment(Class<? extends Fragment> fragment) {
        try {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.frame_layout, fragment.newInstance());
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        } catch (Exception e) {
            Log.e(TAG, "Failed to add fragment", e);
        }
    }

    /**
     * Login example.
     */
    private void setLogin() {
        // Login listener
        final OnLoginListener onLoginListener = new OnLoginListener() {

            @Override
            public void onFail(String reason) {
                mTextStatus.setText(reason);
                Log.w(TAG, "Failed to login");
            }

            @Override
            public void onException(Throwable throwable) {
                mTextStatus.setText("Exception: " + throwable.getMessage());
                Log.e(TAG, "Bad thing happened", throwable);
            }

            @Override
            public void onLogin(String accessToken, List<Permission> acceptedPermissions, List<Permission> declinedPermissions) {
                // change the state of the button or do whatever you want
                mTextStatus.setText("Logged in");
                loggedInUIState();
            }

            @Override
            public void onCancel() {
                mTextStatus.setText("Canceled");
                Log.w(TAG, "Canceled the login");
            }

        };

        mButtonLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                mSimpleFacebook.login(onLoginListener);
            }
        });
    }

    /**
     * Logout example
     */
    private void setLogout() {
        final OnLogoutListener onLogoutListener = new OnLogoutListener() {

            @Override
            public void onLogout() {
                // change the state of the button or do whatever you want
                mTextStatus.setText("Logged out");
                loggedOutUIState();
            }
        };

        mButtonLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                mSimpleFacebook.logout(onLogoutListener);
            }
        });
    }

    private void setUIState() {
        if (mSimpleFacebook.isLogin()) {
            loggedInUIState();
        } else {
            loggedOutUIState();
        }
    }

    private void loggedInUIState() {
        mButtonLogin.setEnabled(false);
        mButtonLogout.setEnabled(true);
        mExamplesAdapter.setLogged(true);
        mTextStatus.setText("Logged in");
    }

    private void loggedOutUIState() {
        mButtonLogin.setEnabled(true);
        mButtonLogout.setEnabled(false);
        mExamplesAdapter.setLogged(false);
        mTextStatus.setText("Logged out");
    }
}
